﻿/*************************************************
  * 描述：主要封装的生成码时的配置，包括图标配置，生成码时的整体配置；
  * 在生成码时，需要传入码的一些配置，可以通过链式调用的方式设置
  *
  * File：codeimageconfig.h
  * Author：gaomaolong@mozihealthcare.cn
  * Date：2025-09-23
  * Update：
  * ************************************************/
#ifndef CODEIMAGECONFIG_H
#define CODEIMAGECONFIG_H

#include <QImage>
#include <common/export.h>

enum class ErrorCorrectionLevel : uint8_t
{
	LOW = 1,     // 7% 容错率
	MEDIUM = 2,  // 15% 容错率
	QUARTILE = 3,// 25% 容错率
	HIGH = 4,    // 30% 容错率
};

enum class BarcodeType : uint8_t
{
	// 一维条形码
	CODE_128,
	EAN_13,

	// 二维码
	QR_CODE,
	MICRO_QR
};

/**
 * 图标配置，主要配置了二维码中间图标的一些属性
 */
class CXI_COMMON_EXPORT IconConfig
{
public:
	IconConfig();

	IconConfig& setImage(const QImage& image);
	IconConfig& setScalePercent(uint8_t percent);
	IconConfig& setBorderWidth(uint8_t width);
	IconConfig& setDrawRect(bool enabled);

	QImage getImage() const;
	uint8_t getScalePercent() const;
	uint8_t getBorderWidth() const;
	bool isDrawRect() const;
	bool isValid() const;

private:
	QImage m_image;        // 图标图片
	uint8_t m_scalePercent;// 图标相对于二维码的缩放比例，默认20,超过一定限制会自动调整,保证二维码可用性
	uint8_t m_borderWidth; // 图标边框宽度,在设置图标时,会自动调整
	bool m_isDrawRect;     // 默认绘制矩形，非矩即圆（后面有需求的话，再拓展）
};

class CXI_COMMON_EXPORT CodeImageConfig
{
public:
	CodeImageConfig();
	CodeImageConfig& setType(BarcodeType type);

	// 设置容错级别，仅二维码有效
	CodeImageConfig& setErrorCorrection(ErrorCorrectionLevel level);

	// 设置码颜色
	CodeImageConfig& setColors(const QColor& foreground = Qt::black, const QColor& background = Qt::white);

	CodeImageConfig& setQuietZone(bool enabled);

	// 显示文本，仅条形码有效
	CodeImageConfig& setShowText(bool show);

	//设置安静区宽度，不建议设置，建议使用默认值；
	CodeImageConfig& setQuietZoneWidth(int width);

	//设置安静区高度不建议设置，建议使用默认值
	CodeImageConfig& setQuietZoneHeight(int height);

	//如果设置不合理，可能会出现边缘空白较大的情况；不设置的话，返回原始尺寸
	CodeImageConfig& setSize(const QSize& size);

	//会对设置的图标进行合理性检查和调整，检查比例和边线宽度
	CodeImageConfig& setIcon(const IconConfig& icon);

	BarcodeType getType() const;
	QSize getSize() const;
	ErrorCorrectionLevel getErrorLevel() const;
	QColor getFgColor() const;
	QColor getBgColor() const;
	bool getQuietZone() const;
	int getQuietZoneWidth() const;
	int getQuietZoneHeight() const;
	bool getShowText() const;
	IconConfig getIcon() const;
	bool operator==(const CodeImageConfig& code_config) const;

	/**
	 * 二维码的默认配置
	 * @return CodeConfig 默认配置
	 */
	static CodeImageConfig defaultQRCode();

	/**
	 * 条形码的默认配置
	 * @return CodeConfig 默认配置
	 */
	static CodeImageConfig defaultBarcode();

private:
	BarcodeType m_type;//码类型
	QSize m_size;      //尺寸
	QColor m_fgColor;  //前景色
	QColor m_bgColor;  //背景色

	bool m_quietZone;                 //是否启用安静区
	int m_quietWidth;                 //安静区宽度，单位模块数(不建议配置，建议使用默认值)
	int m_quietHeight;                //安静区高度，单位模块数(不建议设置，建议使用默认值)
	bool m_showText;                  //是否显示文本,适用于条形码，二维码不支持
	ErrorCorrectionLevel m_errorLevel;//容错级别:适用于二维码，条形码不支持
	IconConfig m_iconConfig;          //二维码图标配置
};

#endif//CODEIMAGECONFIG_H